¿Qué es Traefik?
Traefik es un router que permite publicar servicios en internet de una manera rápida y sencilla. Recibe peticiones y determina qué servicios deben responderlas. Existen otras herramientas parecidas que también actúan cómo proxy inverso tales cómo haproxy.
Además de actuar cómo proxy inverso, también dispone de utilidades que nos harán la vida más sencilla con respecto a la gestión, adquisición y renovación de certificados SSL, ya que lo hace de manera automática. En este ejemplo utilizaremos LetsEncrypt como proveedor de certificados, aunque se pueden utilizar otros.
Una vez instalado el manejo es relativamente sencillo una vez se llega a comprender cómo funciona. Se gestiona mediante etiquetas (labels) en los servicios o contenedores en los que queremos que actúe.
Requisitos Previos
- Docker instalado siguiendo los pasos de Cómo instalar Docker en Ubuntu 20.04.
- Docker Compose instalado siguiendo los pasos de Cómo instalar Docker Compose en Ubuntu 20.04.
Instalar Traefik
Para instalar Traefik en nuestro sistema, crearemos un contenedor Docker utilizando la herramienta Docker Compose. Para ello lo primero que haremos será crear una estructura de directorios y ficheros de configuración para el servicio, además de un fichero docker-compose.yml con la definición del contenedor, y después lo pondremos en ejecución en el sistema.
mkdir -p docker/traefik/traefik-data
touch docker/traefik/traefik-data/acme.json
chmod 600 docker/traefik/traefik-data/acme.json
nano docker/traefik/traefik-data/traefik.yml
Dentro del fichero traefik.yml incluimos el siguiente contenido. Cambiar la dirección de correo para que LetsEncrypt nos avise acerca de la caducidad de los certificados:
api:
dashboard: true
entryPoints:
http:
address: ":80"
https:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
certificatesResolvers:
http:
acme:
email: email@ejemplo.com
storage: acme.json
httpChallenge:
entryPoint: http
Traefik escuchará así en los puertos 80 y 443 correspondientes a los servicios http y https respectivamente. El dashboard de monitorización de Traefik no dispone de método de autentificación, así que crearemos unas credenciales en formato htpasswd para después asigárselas al servicio del dashboard de Traefik. Cambiar el usuario y contraseña por los que deseemos:
sudo apt-get install apache2-utils
echo $(htpasswd -nb ) | sed -e s/\\$/\\$\\$/g
Ahora procedemos a crear la red virtual dónde estará enganchado Traefik y el contenedor:
docker network create traefik-proxy
cd docker/traefik
nano docker-compose.yml
Dentro del fichero docker-compose.yml incluimos el siguiente contenido. Cambiar el usuario/contraseña por los generados anteriormente, y el host de acceso por el que corresponda:
version: '3'
services:
traefik:
image: traefik:v2.4.2
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- traefik-proxy
ports:
- 80:80
- 443:443
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik-data/traefik.yml:/traefik.yml:ro
- ./traefik-data/acme.json:/acme.json
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=http"
- "traefik.http.routers.traefik.rule=Host(`traefik.ejemplo.com`)"
- "traefik.http.middlewares.traefik-auth.basicauth.users=USUARIO:CONTRASEÑA"
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "traefik.http.routers.traefik-secure.rule=Host(`traefik.ejemplo.com`)"
- "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
- "traefik.http.routers.traefik-secure.tls=true"
- "traefik.http.routers.traefik-secure.tls.certresolver=http"
- "traefik.http.routers.traefik-secure.service=api@internal"
networks:
traefik-proxy:
external: true
Guardamos la información pulsando Ctrl+X, y, ENTER.
Ponemos en marcha el contenedor usando Docker Compose:
docker-compose up -d
Abrimos un navegador web, y accedemos al dashboard de Traefik que tenemos en ejecución en Docker:
https://traefik.ejemplo.com/